package com.sunnada.nginx.common;

import com.github.odiszapc.nginxparser.*;
import com.sunnada.nginx.conf.Configer;
import com.sunnada.nginx.exception.CustonException;
import com.sunnada.nginx.exception.NginxServiceManagerException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Collection;
import java.util.List;

/**
 * Nginx 配置工具类
 * @Project : nginx-gui
 * @Program Name : com.aiyi.HttpServer.manager.nginx.common.NginxUtils.java
 * @Description : 
 * @Author : 郭胜凯
 * @Creation Date : 2018年2月22日 下午6:20:18
 * @ModificationHistory Who When What ---------- ------------- -----------------------------------
 *                      郭胜凯 2018年2月22日 create
 */
@Component
public class NginxUtils {

	@Autowired
	Configer configer;

	/**
	 * 读配置
	 * @Description : 
	 * @return : NgxConfig
	 * @Creation Date : 2018年2月22日 下午6:20:29
	 * @Author : 郭胜凯
	 */
	public NgxConfig read() throws CustonException {
		try {
			return NgxConfig.read(configer.getNginxConfPath());
		} catch (Exception e) {
			throw new CustonException("读取Nginx配置文件失败");
		}
	}
	
	/**
	 * 写配置
	 * @Description : 
	 * @return : void
	 * @Creation Date : 2018年2月23日 下午7:32:26
	 * @Author : 郭胜凯
	 */
	public void save(NgxConfig conf) {
		try(FileOutputStream out = new FileOutputStream(configer.getNginxConfPath())) {
			out.write(toString(conf).getBytes("UTF-8"));
			out.flush();
		} catch (Exception e) {
			throw new NginxServiceManagerException("Nginx配置文件写入失败");
		}
	}
	
	
	/**
	 * 配置到文本
	 * @Description : 
	 * @return : String
	 * @Creation Date : 2018年2月23日 下午7:32:38
	 * @Author : 郭胜凯
	 */
	public static String toString(NgxConfig conf) {
		if (null == conf) {
			throw new NginxServiceManagerException("不能写入空配置");
		}
		NgxDumper dumper = new NgxDumper(conf);
		return dumper.dump();
	}
	
	/**
	 * 写配置
	 * @Description : 
	 * @return : void
	 * @Creation Date : 2018年2月23日 下午7:33:44
	 * @Author : 郭胜凯
	 */
	public void save(String conf) {
		try(FileOutputStream out = new FileOutputStream(configer.getNginxConfPath())) {
			out.write(conf.getBytes("UTF-8"));
			out.flush();
		} catch (Exception e) {
			throw new NginxServiceManagerException("Nginx配置文件写入失败");
		}
	}

	public static void printBlock(NgxBlock block){
		System.out.println("block:"+block);
		System.out.println("block.name:"+block.getName());
		System.out.println("block.value:"+block.getValue());
		System.out.println("block.tokens:"+block.getTokens());
		System.out.println("block.values:"+block.getValues());
		System.out.println("block.entries:"+block.getEntries());
		Collection<NgxEntry> entries = block.getEntries();
		for (NgxEntry entry : entries) {
			if (entry instanceof NgxComment){
				continue;
			}
			if (entry instanceof NgxParam){
				NgxParam ngxParam = (NgxParam)entry;
				printParam(ngxParam);
			}
			if (entry instanceof NgxBlock){
				NgxBlock ngxBlock = (NgxBlock) entry;
				printBlock(ngxBlock);
			}
		}
	}

	public static void printParam(NgxParam param){
		System.out.println("ngxParam:"+param);
		System.out.println("ngxParam.name:"+param.getName());
		System.out.println("ngxParam.tokens:"+param.getTokens());
		System.out.println("ngxParam.value:"+param.getValue());
		System.out.println("ngxParam.values:"+param.getValues());
	}
	
	/**
	 * 校验Nginx配置文件
	 * @Description : 
	 * @return : void
	 * @Creation Date : 2018年2月26日 上午9:59:18
	 * @Author : 郭胜凯
	 */
	public static void check() {
		// TODO Auto-generated method stub
		
	}
}
